package ComoViajo;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class Viaje {
	public Collection<Recorrido> recorridos = new ArrayList<Recorrido>();


	/**
	 * usado por RedDeTransporte para crear los viajes
	 * @author eugenio
	 * @return Viaje un nuevo objeto que es un clone de este	
	 */
	public Viaje clone(){
		Viaje copiaViaje=new Viaje();
		copiaViaje.recorridos.addAll(this.recorridos);
		return copiaViaje;
	}
	
	
	/**
	 * @author fede
	 * @return Devuelve el costo total del viaje
	 */
	public BigDecimal getCosto() {

		Recorrido recorrido, recorridoPrev = null;
		Iterator<Recorrido> itrRecorrido = this.recorridos.iterator();
		BigDecimal costoViaje = new BigDecimal(0);

		while (itrRecorrido.hasNext()) {

			recorrido = itrRecorrido.next();

			// si hace combinacion se suma el tiempo que tarda la combinacion
			if (recorridoPrev == null) {
				costoViaje = costoViaje.add(recorrido.getCosto());
			} else {

				// si no es una combinacion subte subte, suma el costo del
				// pasaje
				if (!((recorrido.getClassName()!="RecorridoSubte") && (recorridoPrev.getClassName()!="RecorridoSubte"))) {
					costoViaje = costoViaje.add(recorrido.getCosto());
				}
			}

			recorridoPrev = recorrido;
		}

		return costoViaje;
	}

	/**
	 * @return Devuelve el costo total del viaje aplicando los descuentos
	 */
	public BigDecimal getCosto(String laTarjeta) {
		BigDecimal costo = this.getCosto();
		
		/**
		 *  TODO aplicar los descuentos a la variable costo usando la tarjeta
		 *  
		 */
		
		return costo;
		
	}
	
	/**
	 * @author eugenio
	 * @return Devuelve el tiempo que tarda este viaje
	 * @throws ComoViajeException 
	 */
	public int getTiempo() throws ComoViajeException {
		Recorrido recorrido, recorridoPrev = null;
		int tiempo = 0;
		Iterator<Recorrido> itrRecorrido = this.recorridos.iterator();

		while (itrRecorrido.hasNext()) {
			recorrido = itrRecorrido.next();
			// calcula el tiempo solo del ramal
			tiempo = tiempo + recorrido.getTiempo();

			// si hace combinacion se suma el tiempo que tarda la combinacion
			if (recorridoPrev != null) {
				tiempo += recorrido.getTiempoTransbordo(recorridoPrev);
			}

			recorridoPrev = recorrido;
		}

		return tiempo;
	}

	
	/**
	 * 
	 * @param estacion que queremos meter en el recorrido
	 * @return un nuevo recorrido que puede contener el tipo de estaciones estacion
	 * @throws ComoViajeException en caso de que el tipo de estacion no este definido
	 */
	public Recorrido nuevoRecorrido(Estacion estacion) throws ComoViajeException {
		if(estacion.getClassName()=="EstacionTren"){
			RecorridoTren recorrido=new RecorridoTren();
			return recorrido;
		}else if(estacion.getClassName()=="EstacionSubte"){
			RecorridoSubte recorrido=new RecorridoSubte();
			return recorrido;
		}else{
			throw new ComoViajeException();
		}
	}
	
	/**
	 * Transformar todos los viajes a string para depurar
	 */
	public String toString(){
		Iterator<Recorrido> recorridosIterator = this.recorridos.iterator();
		String recorridosString="";
		
		if(recorridosIterator.hasNext()){
			recorridosString="{"+recorridosIterator.next().toString();
		}
		
		while(recorridosIterator.hasNext()){
			recorridosString=recorridosString+"}{"+recorridosIterator.next().toString();
		}
		
		if(recorridosString!=""){
			recorridosString=recorridosString+"}";
		}
		
		return recorridosString;
	}
}